
/*
 * Copyright 2015 Splunk, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"): you may
 * not use this file except in compliance with the License. You may obtain
 * a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations
 * under the License.
 */

package com.splunk;

import org.junit.Assert;
import org.junit.Test;
import org.junit.Assume;

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

public class ReceiverTest extends SDKTestCase {

    @Test
    public void testReceiverWithoutCookie() {
        service.removeAllCookies();
        testReceiver(service);
    }

    @Test
    public void testReceiverWithCookie() {
        Assume.assumeTrue(service.versionIsAtLeast("6.2"));
        Assert.assertTrue(service.hasCookies());
        testReceiver(service);
    }
    // Make a few simple requests and make sure the results look ok.
    public void testReceiver(Service passedService) {
        Receiver receiver = passedService.getReceiver();

        final String indexName = passedService.getIndexes().get("_internal").getDefaultDatabase();
        final Index index = passedService.getIndexes().get(indexName);
        final int originalEventCount = index.getTotalEventCount();
        final int versionCompare = passedService.versionCompare("6.0.0");
        final String osName = passedService.getInfo().getOsName();

        try {
            Socket socket1 = receiver.attach();
            OutputStream stream = socket1.getOutputStream();

            String s = createTimestamp() + " Boris the mad baboon1!\r\n";
            stream.write(s.getBytes("UTF-8"));
            // Splunk won't deterministically index these events until the socket is closed or greater than 1MB
            // has been written.
            stream.close();
            socket1.close();
        } catch (IOException e) {
            Assert.fail("Exception on attach");
        }

        try {
            Socket socket1 = receiver.attach(Args.create("sourcetype", "mysourcetype"));
            OutputStream stream = socket1.getOutputStream();

            String s = createTimestamp() + " Boris the mad baboon2!\r\n";
            stream.write(s.getBytes("UTF-8"));
            // Splunk won't deterministically index these events until the socket is closed or greater than 1MB
            // has been written.
            stream.close();
            socket1.close();
        } catch (IOException e) {
            Assert.fail("Exception on attach");
        }

        receiver.submit("Boris the mad baboon3!\r\n");
        receiver.submit(Args.create("sourcetype", "mysourcetype"), "Boris the mad baboon4!\r\n");
        receiver.log("Boris the mad baboon5!\r\n");
        receiver.log("main", "Boris the mad baboon6!\r\n");
        receiver.log(Args.create("sourcetype", "mysourcetype"), "Boris the mad baboon7!\r\n");
        receiver.log(indexName, Args.create("sourcetype", "mysourcetype"), "Boris the mad baboon8!\r\n");

        assertEventuallyTrue(new EventuallyTrueBehavior() {
            {
                tries = 200;
            }

            @Override
            public boolean predicate() {
                index.refresh();
                int eventCount = index.getTotalEventCount();
                // WORKAROUND (SPL-75109): Splunk 6.0 on Windows doesn't record events submitted to the streaming
                // HTTP input without a sourcetype.
                //
                if (versionCompare == 0 && osName.equals("Windows")) {
                    return eventCount == originalEventCount + 7;
                } else {
                    return eventCount == originalEventCount + 8;
                }
            }
        });
    }
}
